package com.example.pro1.util.zhao;

import java.util.HashMap;
import java.util.Map;
import java.util.Stack;

public class KV2MapUtils {

    public static Map<String, String> String2Map(String dealStr) {
        Map<String, String> paraMap = new HashMap<String, String>();
        //1、两个&符号分割中间至少要有一个等号
        if (dealStr != null && !dealStr.isEmpty()) {
            Stack paraPairStack = new Stack();//&拆分出来的栈
            int splitAndIndex;//最新的&下标
            String splitStr;//&符号分割出来的字符串
            while(dealStr.length() > 1) {
                splitAndIndex = dealStr.indexOf("&");
                if (splitAndIndex == -1) {
                    //没有&的情况
                    if (!dealStr.contains("=")) {
                        //剩下的字符串没有键值对，则添加到上一个栈中
                        appendToPreStack(paraPairStack, dealStr, dealStr.length());
                        break;
                    }
                    else {

                        paraPairStack.push(dealStr);
                        dealStr=dealStr.substring(0,0);
                    }

                }else if(splitAndIndex == 0){
                    //第一个字符就是&，则添加到上一栈中
                    appendToPreStack(paraPairStack, dealStr, splitAndIndex);
                }else{
                    splitStr = dealStr.substring(0, splitAndIndex);
                    if(!splitStr.contains("=")){
                        //第一个字符就是&，则添加到上一栈中
                        appendToPreStack(paraPairStack, dealStr, splitAndIndex);
                    }else{
                        paraPairStack.push(splitStr);
                    }
                }
                dealStr = dealStr.substring(splitAndIndex + 1);
            }

            //2、&分割完的栈，只分割第一个等号作为对于的key 和 value
            String preKey = "";
            for(Object paraPair : paraPairStack){
                String paraPairStr = paraPair.toString();
                int equalIndex = paraPairStr.indexOf("=");
                if(equalIndex == -1){
                    //字符串开头就是=
                    preKey = "";
                }else {
                    preKey = paraPairStr.substring(0, equalIndex);
                }

                paraMap.put(preKey, paraPairStr.substring(equalIndex+1));
            }


        }
        return paraMap;
    }

    /**
     *
     * @param paraPairStack 存储用&分割后的字符串的栈
     * @param dealStr 剩余还没分割的字符串
     * @param length &后面字符串的长度
     */

    private static void appendToPreStack(Stack paraPairStack, String dealStr, int length) {

        paraPairStack.push((paraPairStack.empty() ? "" : paraPairStack.pop()) + "&" + dealStr.substring(0, length));


    }
}
